package com.watchme.parser;


import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Created by Mengxy on 2017/11/28.
 */
public class Test {
//    private static Configuration configuration;
//
//    static {
//        configuration = HBaseConfiguration.create();
//        configuration.set("hbase.zookeeper.quorum", "192.168.10.149,192.168.10.44,192.168.10.49");
//        configuration.set("hbase.zookeeper.property.clientPort", "2181");
//    }
    //classpath的文件路径
    private static BASE64Encoder encoder = new sun.misc.BASE64Encoder();
    private static BASE64Decoder decoder = new sun.misc.BASE64Decoder();

        /**
         * * 将图片转换成Base64编码
         * @param
         * @return
         */
    public static void main(String[] args) {
        //将PDF格式文件转成base64编码
        String base64String = getPDFBinary(new File("D://data//test1.pdf"));
        System.out.println(base64String);
//        String tableName = "crm_pdf_data";//表名
//        String id = "400015747124";//订单号
//        //时间戳
//        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//        Date date=new Date();
//        String dateStr=sdf.format(date);
//        long hdate = Long.valueOf(dateStr);
//
//        HTablePool pool = new HTablePool(hbaseConfig, 1000);
//        HTable table = (HTable) pool.getTable(tableName);
//        Put put = new Put(id.getBytes());// 一个PUT代表一行数据，再NEW一个PUT表示第二行数据,每行一个唯一的ROWKEY，此处rowkey为put构造方法中传入的值
////        put.add(Bytes.toBytes("d"),Bytes.toBytes("pdfInfo"), base64String.getBytes());// 本行数据的第一列
//        put.add(Bytes.toBytes("d"),Bytes.toBytes("pdfInfo"),hdate,Bytes.toBytes(base64String));// 本行数据的第一列
//        try {
//            table.put(put);
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
    }

    /**
     *  将PDF转换成base64编码
     *  1.使用BufferedInputStream和FileInputStream从File指定的文件中读取内容；
     *  2.然后建立写入到ByteArrayOutputStream底层输出流对象的缓冲输出流BufferedOutputStream
     *  3.底层输出流转换成字节数组，然后由BASE64Encoder的对象对流进行编码
     * */
    public static String getPDFBinary(File file) {
        FileInputStream fin =null;
        BufferedInputStream bin =null;
        ByteArrayOutputStream baos = null;
        BufferedOutputStream bout =null;
        try {
            //建立读取文件的文件输出流
            fin = new FileInputStream(file);
            //在文件输出流上安装节点流（更大效率读取）
            bin = new BufferedInputStream(fin);
            // 创建一个新的 byte 数组输出流，它具有指定大小的缓冲区容量
            baos = new ByteArrayOutputStream();
            //创建一个新的缓冲输出流，以将数据写入指定的底层输出流
            bout = new BufferedOutputStream(baos);
            byte[] buffer = new byte[1024];
            int len = bin.read(buffer);
            while(len != -1){
                bout.write(buffer, 0, len);
                len = bin.read(buffer);
            }
            //刷新此输出流并强制写出所有缓冲的输出字节，必须这行代码，否则有可能有问题
            bout.flush();
            byte[] bytes = baos.toByteArray();
            //sun公司的API
            return encoder.encodeBuffer(bytes).trim();
            //apache公司的API
            //return Base64.encodeBase64String(bytes);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            try {
                fin.close();
                bin.close();
                //关闭 ByteArrayOutputStream 无效。此类中的方法在关闭此流后仍可被调用，而不会产生任何 IOException
                //baos.close();
                bout.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }


}
